import os
import uuid

from config import Config
from logger_config import get_logger
from utils.session_utils import update_session_info

from biomni.agent import A1

logger = get_logger(__name__)

class AgentService:
    """代理服务类，负责管理代理实例"""
    
    def __init__(self):
        self.agent_instances = {}
        self.config = Config()
    
    def create_agent_instance(self, api_key, base_url, llm_model, data_path):
        """创建代理实例
        
        Args:
            api_key: API密钥
            base_url: API基础URL
            llm_model: LLM模型名称
            data_path: 数据路径
        
        Returns:
            tuple: (session_id, agent_instance)
        
        Raises:
            Exception: 创建代理实例失败时抛出异常
        """
        try:
            # 设置环境变量
            os.environ["ANTHROPIC_API_KEY"] = api_key
            os.environ["ANTHROPIC_BASE_URL"] = base_url
            os.environ["OPENAI_API_KEY"] = api_key
            os.environ["OPENAI_BASE_URL"] = base_url
            
            # 设置数据路径环境变量确保一致性
            os.environ['BIOMNI_PATH'] = data_path
            logger.info(f"设置BIOMNI_PATH环境变量为: {data_path}")

            # 生成会话ID
            session_id = str(uuid.uuid4())

            # 创建代理实例
            agent = A1(path=data_path, llm=llm_model, source=None, api_key=api_key, base_url=base_url)
            # 配置代理实例
            agent.configure()
            self.agent_instances[session_id] = agent

            # 更新会话信息
            update_session_info(session_id, llm_model, data_path, api_key, base_url)

            logger.info(f"代理实例创建成功，模型: {llm_model}，会话ID: {session_id}")
            return session_id, agent
            
        except Exception as e:
            logger.error(f"创建代理实例失败: {str(e)}")
            raise
    
    def _create_agent_direct(self, api_key, base_url, llm_model, data_path):
        """直接创建代理实例（不生成新的session_id）
        
        Args:
            api_key: API密钥
            base_url: API基础URL
            llm_model: LLM模型名称
            data_path: 数据路径
        
        Returns:
            agent_instance: 代理实例
        
        Raises:
            Exception: 创建代理实例失败时抛出异常
        """
        try:
            # 设置环境变量
            os.environ["ANTHROPIC_API_KEY"] = api_key
            os.environ["ANTHROPIC_BASE_URL"] = base_url
            os.environ["OPENAI_API_KEY"] = api_key
            os.environ["OPENAI_BASE_URL"] = base_url
            
            # 设置数据路径环境变量确保一致性
            os.environ['BIOMNI_PATH'] = data_path
            logger.info(f"设置BIOMNI_PATH环境变量为: {data_path}")

            # 创建代理实例
            agent = A1(path=data_path, llm=llm_model, source=None, api_key=api_key, base_url=base_url)
            # 配置代理实例
            agent.configure()
            
            logger.info(f"直接创建代理实例成功，模型: {llm_model}")
            return agent
            
        except Exception as e:
            logger.error(f"直接创建代理实例失败: {str(e)}")
            raise
    
    def get_agent_instance(self, session_id):
        """获取代理实例
        
        Args:
            session_id: 会话ID
        
        Returns:
            代理实例，如果不存在返回None
        """
        return self.agent_instances.get(session_id)
    
    def remove_agent_instance(self, session_id):
        """移除代理实例
        
        Args:
            session_id: 会话ID
        
        Returns:
            bool: 是否成功移除
        """
        if session_id in self.agent_instances:
            del self.agent_instances[session_id]
            logger.info(f"代理实例已移除，会话ID: {session_id}")
            return True
        return False
    
    def get_all_sessions(self):
        """获取所有活跃的会话ID
        
        Returns:
            list: 会话ID列表
        """
        return list(self.agent_instances.keys())
    
    def get_session_count(self):
        """获取活跃会话数量
        
        Returns:
            int: 会话数量
        """
        return len(self.agent_instances)
    
    def auto_initialize(self, api_key, base_url, model, data_path):
        """自动初始化代理实例（兼容app.py调用）
        
        Args:
            api_key: API密钥
            base_url: API基础URL
            model: 模型名称
            data_path: 数据路径
        
        Returns:
            dict: 包含success和session_id或error的字典
        """
        try:
            # 验证必要参数
            if not api_key or api_key == 'your_api_key_here':
                return {'success': False, 'error': '未配置有效的API_KEY'}

            # 验证模型是否支持
            if model not in self.config.MODEL_PLATFORM_MAP:
                return {'success': False, 'error': f'不支持的模型 {model}'}

            # 验证数据路径
            if not os.path.exists(data_path):
                return {'success': False, 'error': f'数据路径不存在 {data_path}'}

            # 创建代理实例
            session_id, agent = self.create_agent_instance(
                api_key, base_url, model, data_path
            )

            return {'success': True, 'session_id': session_id}

        except Exception as e:
            logger.error(f"自动初始化失败: {str(e)}", exc_info=True)
            return {'success': False, 'error': str(e)}
    
    def auto_initialize_service(self):
        """服务启动时自动初始化代理实例
        
        Returns:
            str: 默认会话ID，如果初始化失败返回None
        """
        try:
            # 检查是否启用自动初始化
            if not self.config.AUTO_INITIALIZE:
                logger.info("自动初始化已禁用")
                return None

            # 获取配置参数
            api_key = self.config.API_KEY
            base_url = self.config.BASE_URL
            default_model = self.config.DEFAULT_MODEL
            data_path = self.config.DATA_PATH
            
            # 设置环境变量确保biomni包使用一致的数据路径
            os.environ['BIOMNI_PATH'] = data_path
            logger.info(f"设置BIOMNI_PATH环境变量为: {data_path}")

            # 使用auto_initialize方法
            result = self.auto_initialize(api_key, base_url, default_model, data_path)
            
            if result['success']:
                logger.info(f"服务自动初始化成功 - 模型: {default_model}, 会话ID: {result['session_id']}")
                return result['session_id']
            else:
                logger.warning(f"自动初始化失败: {result['error']}")
                return None

        except Exception as e:
            logger.error(f"自动初始化失败: {str(e)}", exc_info=True)
            return None
    
    def validate_model_support(self, model_name):
        """验证模型是否支持
        
        Args:
            model_name: 模型名称
        
        Returns:
            bool: 是否支持该模型
        """
        return model_name in self.config.MODEL_PLATFORM_MAP
    
    def get_model_platform(self, model_name):
        """获取模型对应的平台
        
        Args:
            model_name: 模型名称
        
        Returns:
            str: 平台名称，如果模型不支持返回None
        """
        return self.config.MODEL_PLATFORM_MAP.get(model_name)
    
    def cleanup_inactive_sessions(self, max_inactive_time=3600):
        """清理不活跃的会话（预留功能）
        
        Args:
            max_inactive_time: 最大不活跃时间（秒）
        
        Returns:
            int: 清理的会话数量
        """
        # 这里可以实现基于时间的会话清理逻辑
        # 目前只是一个占位符
        logger.info("会话清理功能待实现")
        return 0

# 全局代理服务实例
agent_service = AgentService()